package chess_game_5;

import java.util.Scanner;

//主类
public class NewChessGame {
    private final GameManager gameManager;
    private final DisplayBoard display;
    private final Scanner scanner;

    // 主方法，启动方法start
    public static void main(String[] args) {
        new NewChessGame().start();
    }

    // 构造函数，初始化游戏管理器、棋盘显示和输入扫描器
    public NewChessGame() {
        this.gameManager = new GameManager();
        this.display = new DisplayBoard();
        this.scanner = new Scanner(System.in);
    }

    // 启动方法，循环读取用户输入并处理游戏逻辑
    // 该方法是游戏的主循环，负责处理用户输入和游戏状态更新
    public void start() {
        while (true) {
            Game currentGame = gameManager.getCurrentGame();
            display.printFullUI(currentGame, gameManager.getGames());

            if (currentGame.isGameOver()) {
                GameOver(currentGame);
                continue;
            }

            System.out.print(
                    "\n输入（坐标:1A 棋盘编号：1，2 添加模式(peace(黑白棋无规则)/reversi(黑白棋有规则)/gomoku(五子棋)) 其他命令：pass(放弃此次下棋,仅限reversi)/quit(退出游戏): ");
            String input = scanner.nextLine().trim().toLowerCase();// 读取用户输入的一行，去除前后空格并转换为小写

            if (input.equals("quit")) {
                break;
            } else if (input.matches("\\d+")) {
                SwitchGame(Integer.parseInt(input));
            } else if (input.equals("peace") || input.equals("reversi") || input.equals("gomoku")) {
                AddGame(input);
            } else if (input.equals("pass")) {
                Pass(currentGame);
            } else {
                Move(input, currentGame);
            }
        }
        scanner.close();// 关闭输入，释放内存
    }

    // 游戏切换,这里因为GameMannager中有一个同名的方法，所以这里首字母大写
    private void SwitchGame(int gameId) {
        if (!gameManager.switchGame(gameId)) {
            System.out.println("无效游戏编号！");
        }
    }

    // 处理新游戏（棋盘的添加）
    private void AddGame(String mode) {
        System.out.print("输入玩家1名称: ");
        String p1 = scanner.nextLine();
        System.out.print("输入玩家2名称: ");
        String p2 = scanner.nextLine();
        gameManager.addGame(mode, p1, p2);
    }

    // 实现有棋pass功能
    private void Pass(Game game) {
        if (game.getLegalMoves().isEmpty()) {
            game.getPlayer().switchPlayer();
        } else {
            System.out.println("仍有合法落子位置，不能pass！");
        }
    }

    // 调用其他类的方法，处理棋子的移动，和无效输入的问题
    private void Move(String input, Game game) {
        int[] pos = display.parsePosition(input);
        if (pos == null || !game.placeChess(pos[0], pos[1])) {
            System.out.println("无效输入或位置！");
        }
    }

    // 游戏结束！
    private void GameOver(Game game) {
        // lab5 游戏结束提示实现
        display.printFullUI(game, gameManager.getGames());

        if (game.getMode().equals("gomoku")) {
            System.out.println("游戏结束！玩家 [" + game.getPlayer().getCurrentPlayerName() + "] 获胜！");
        } else if (game.getMode().equals("reversi")) {
            System.out.println("游戏结束！玩家[" + game.getPlayer().getCurrentPlayerName() + "] 最终得分: " + game.getScoreInfo());
        } else if (game.getMode().equals("peace")) {
            System.out.println("棋盘已满，游戏结束！");
        }
        System.out.print("输入 'quit' 退出程序，或按 Enter 继续其他游戏: ");
        String input = scanner.nextLine().trim().toLowerCase();
        if (input.equals("quit")) {
            System.exit(0); // 直接退出程序
        }
        gameManager.switchGame(1); // 切换到默认游戏1，（避免卡在结束状态），bug解决方法
        /*
         * if (game.getMode().equals("gomoku")) {
         * // 检查最后一步是否是胜利落子
         * System.out.println("游戏结束！玩家 [" + game.getPlayer().getCurrentPlayerName() +
         * "] 获胜！");
         * } else if (game.getMode().equals("reversi")) {
         * System.out.println("游戏结束！玩家[" + game.getPlayer().getCurrentPlayerName() +
         * "]最终得分: " + game.getScoreInfo());
         * } else if (game.getMode().equals("peace")) {
         * System.out.println("棋盘已满，游戏结束！");
         * }
         * scanner.nextLine();
         */
        // 五子棋模式存在bug，一方玩家获得胜利后无法退出，删除

        /*
         * System.out.println("游戏结束！");
         * if (game.getMode().equals("reversi")) {
         * System.out.println("最终得分: " + game.getScoreInfo());
         * }
         * System.out.println("按Enter继续...");
         * scanner.nextLine();
         */
        // lab4 版本
    }
}